<?php
/**
 * 布尔值
 */
$bool=true;
$bool=false;

//布尔值是不区分大小写的
var_dump(TRUE===true);
var_dump(true===TRue);
var_dump(TRue===trUE);

//进行类型转换后，相当于false的值
var_dump(0 == false);
var_dump(0.0 == false);
var_dump("" == false);
var_dump("0" == false);//"0"字符串也会被转换为false
var_dump([] == false);
var_dump(null == false);
var_dump(new SimpleXMLElement("<div></div>") == false);//空的SimpleXML对象也会被转换为false

//进行类型转换后，相当于true的值
var_dump(NAN == true);//非数字值的特殊值不会被转换为false,而是true
var_dump(-1 == true);//任何不等于0的数字都会被转换为true,包括负数、NAN


/**
 * 整型
 */
$a = 1234; // 十进制数
$a = -123; // 负数
$a = 0123; // 八进制数 (等于十进制 83)
$a = 0x1A; // 十六进制数 (等于十进制 26)
$a = 0b11111111; // 二进制数字 (等于十进制 255)

//PHP中的整数的长度可能是32位，也可能是64位，取决于系统。
var_dump(PHP_INT_SIZE);//显示整型占用的字节长度
var_dump(PHP_INT_MAX);

//类型转换
var_dump((int)true);
var_dump((int)false);


/**
 * 浮点数
 */
$a = 1.234; 
$b = 1.2e3; //e大小写都可以，用来表示科学计数法
$c = 7E-10;

var_dump(1.2e-3);
var_dump(0.01===1E-2);

//由于十进制和二进制的转换存在误差，实际上浮点数是不能用做精确计算的
var_dump(floor((0.1+0.7)*10));//正确的结果是8，实际结果是7;这表示实际存储的是7.9999999999999991118，存在微小的误差

//特殊值
var_dump(NAN);//NAN,表示非法的数值
//Infinity,表示无穷大,不能直接创建

/**
 * String 字符串
 */
$str1='this is a simple string';
$str2="hello world,$str1";
echo $str1."<br/>\r\n";
echo $str2."<br/>\r\n";

//单引号
var_dump('单引号中的字符串不会解析除了单引号本身和转义字符之外的特殊字符，所以这些字符不需要被转义
\'转义单引号\'
\\转义转义字符
多行字符串
\r\n 其他特殊字符无效
$str1 变量也不会被解析
\a 如果转义无效，转义字符会原样显示
');

//双引号
$test=["value"=>"2333"];
var_dump("双引号中的特殊字符会被解析
\'不转义单引号\'
\"转义双引号\"
\r\n 可以使用换行符之类的特殊字符
$str1 变量会被解析
{$test["value"]} 用花括号显式地声明变量的边界，防止表达式和普通字符串混淆
");
var_dump("cccc"==true);
var_dump(true=="cccc");

//Heredoc 结构
$str = <<< EOT
Heredoc 结构中，字符串是在下一行开始的
"EOT"是一个标识符，可以用任意的标识符替代
开始标记后面不能跟任何字符
结束标记是标识符加分号，必须独占一行，前后不能有任何其它字符
Heredoc 结构中的特殊字符的解析类似于双引号，但是不会转义双引号本身
EOT;
var_dump($str);//直接用Heredoc作为函数的参数，类属性什么的，会产生语法错误

//Nowdoc 结构
$str = <<< 'EOT'
跟Heredoc 结构的区别是开始标记中的标识符需要用单引号括起来
转义规则类似于单引号，但不会转义单引号
EOT;
var_dump($str);

/**
 * 字符串是由字符组成的
 * PHP 中的 string 的实现方式是一个由字节组成的数组再加上一个整数指明缓冲区长度。
 * 字符串可以作为一个由字符组成的字符串使用
 */
$str="hello world";
var_dump($str);
var_dump(count($str));
$str[5]=',';
var_dump($str);




/**
 * NULL
 * 特殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL。
 * 在下列情况下一个变量被认为是 NULL：
 */
$nullval;//尚未被赋值。
// var_dump($nullval);//会抛出Notice级别的异常

$nullval="123";
unset($nullval);//被 unset()。
// var_dump($nullval);//会抛出Notice级别的异常

$nullval="456";
$nullval=null;//被赋值为 NULL。
var_dump($nullval);


/**
 * Callback / Callable 类型
 * 可以作为回调函数使用的类型
 * 可以是字符串，也可以是数组
 */
// An example callback function
function my_callback_function() {
    echo 'hello world!';
}

// An example callback method
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
}

// Type 1: Simple callback
call_user_func('my_callback_function'); 

// Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod')); 

// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// Type 4: Static class method call (As of PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');



